package com.czk.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 一 mybatis的逻辑删除
 *   1 配置逻辑删除规则（可省略）
 *   2 配置逻辑删除的组件bean（可省略）
 * 二、aliyun oss使用
 *  1 引入stater
 *  2 配置key id 等信息
 *  3 注入OssClient
 * 三、jsr303表单校验
 *   1 给Bean添加校验注解：javax.validation.constraints,并定义自己的message提示
 *   2 开启校验功能，在springmvc请求的方法中添加@Valid
 *   3 可以给校验的bean后紧跟一个校验的结果，就可以获得校验结果
 *   4 分组校验：
 *                @NotNull(message = "修改必须制定品牌id",groups = {UpdateGroup.class    })
 * 	              @Null(message = "新增不要制定品牌id",groups = {AddGroup.class})
 * 	              给校验注解添加在什么情况下需要进行校验
 * 	    默认没有指定分组的校验，在分组@Validate（group="{xxx.class}"）的情况下不生效，在不分组的是@Validate的时候生效
 * 	 5 自定义校验
 * 	    1）编写一个自定义校验注解
 * 	    2）编写一个自定义校验器
 * 	    3）关联自定义的校验器和自定义的校验注解
 *  四、统一异常处理
 *   1 加入controllerAdvice使用全局异常处理类
 *   2 exceptionHandler处理具体的异常
 *
 *  五：
 *   引入了模板引擎 thymeleaf-starter
 *   静态资源放入static文件夹下，可以按照路径直接访问
 *   页面放在templates下，直接访问 springboot访问时默认会寻找index.html
 *   页面修改不重启服务器·实时更新 y引入devtools 修改完页面 cotrol+f9 重新加载，注意要关掉thy的缓存
 *   六：
 *    redis的引入，引入starter 配置host port的等信息
 *    使用配置好的stringRedisTemplate操作redis
 *   七：整合redisson作为分布式锁框架
 *     1 引入依赖
 *     2 配置redisson
 *
 *    八 整合springCache
 *    1 引入starter spring-boot-starter-cache
 *    2 写配置
 *      CacheAutoConfiguration 会导入 RedisCacheManager
 *      注解
 *      cacheable 放入缓存
 *      cacheEvict 删除缓存
 *      CachePut 不影响方法的更新缓存
 *      cacheing 组合以上多个操作
 *      CacheConfig 在类级别下共享缓存
 *     3 将数据保存为json格式 RedisCacheManager会初始化所有的缓存-》每个缓存决定使用什么配置-》r如果redisCacheConfiguration
 *     总结：
 *     常规数据（读多写少，即时性，一致性要求不高的数据），可以采用spring-cache
 *     特殊数据 ：需要特殊设计
 * @author CZK
 */
@EnableCaching
@SpringBootApplication
@MapperScan(basePackages = {"com.czk.gulimall.product.dao"}) // mapper位置
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.czk.gulimall.product.feign"})
@ComponentScan(basePackages = {"com.czk.gulimall"})
@EnableRedisHttpSession
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
